#include <stdio.h>

//Imprime uma matriz
void imprimeMatriz(int tabuleiro[][9]){
    for (int i = 0; i<9; i++) {
        for (int j = 0; j<9; j++) {
            printf("%d", tabuleiro[i][j]);
            if (j<8) printf(" ");
        }
        printf("\n");
    }
}

//Verifica se a jogada passada pode ser feita
int validaJogada(int x, int y, int v, int tabuleiro[][9]){
    int qX = 0, qY = 0;
    
    //Verifica se o Valor "v" existe na mesma linha ou na mesma coluna
    for (int i = 0; i<9; i++)
        if ((tabuleiro[i][x] == v) && (i != y)) return 0;
    for (int j = 0; j<9; j++)
        if ((tabuleiro[y][j] == v) && (j != x)) return 0;
    
    //Descobre o ponto inicial do quadrante e verifica se o valor "v" existe no mesmo quadrante
    qY = (y/3)*3;
    qX = (x/3)*3;
    for (int k = qY; k<qY+3; k++)
        for (int l = qX; l<qX+3; l++)
            if ((tabuleiro[k][l] == v) && (x != l) && (y != k)) return 0;
    
    //Se nao foi retornado 0, retorna 1
    return 1;
}

//Funcao que valida se o tabuleiro estah resolvido
int validaTabuleiro(int tabuleiro[][9]){
    for (int y = 0; y<9; y++)
        for (int x = 0; x<9; x++)
            if (validaJogada(x, y, tabuleiro[y][x], tabuleiro) == 0) return 0;
    
    return 1;
}

int main ()
{
    int x = 0, y = 0, v = 0, jogadasInvalidas = 0, jogadasValidas = 0;
    int tabuleiro[9][9] = {
        {0, 1, 5, 4, 9, 2, 6, 8, 7},
        {8, 2, 7, 6, 1, 5, 9, 3, 4}, 
        {4, 6, 9, 3, 7, 8, 2, 1, 5}, 
        {2, 9, 1, 7, 8, 3, 4, 5, 6}, 
        {7, 8, 6, 1, 5, 4, 3, 2, 9}, 
        {5, 4, 3, 2, 6, 9, 8, 7, 1}, 
        {1, 3, 2, 5, 4, 6, 7, 9, 8}, 
        {9, 7, 4, 8, 3, 1, 5, 6, 2}, 
        {6, 5, 8, 9, 2, 7, 1, 4, 3}};
//        {3,1,5,4,9,2,6,8,7},
//        {8,2,7,6,1,5,9,3,4},
//        {4,6,9,3,7,8,2,1,5},
//        {2,9,1,7,8,3,4,5,6},
//        {7,8,6,1,5,4,3,2,9},
//        {5,4,3,2,6,9,8,7,1},
//        {1,3,2,5,4,6,7,9,8},
//        {9,7,4,8,3,1,5,6,2},
//        {6,5,8,9,2,7,1,4,3}};
    
    //Le o tabuleiro
//    for (int i = 0; i<9; i++) {
//        for (int j = 0; j<9; j++) {
//            scanf("%d", &tabuleiro[i][j]);
//        }
//    }
    
    //Le e valida as jogadas ateh aparecer a jogada -1 -1 -1
    //y == LINHAS e x == COLUNAS , imaginando que a matriz eh um plano cartesiano
    while ((x != -1) || (y != -1) || (v != -1)){
        scanf("%d", &y);
        scanf("%d", &x);
        scanf("%d", &v);
        
        //O X e o Y devem ser entre 0 e 8, o V (valor) deve ser entre 1 e 9 e deve ser valido conforme a regra basica do SUDOKU
        if ((x != -1) || (y != -1) || (v != -1)) {
            if      ((x<0) || (x>8)) jogadasInvalidas++;
            else if ((y<0) || (y>8)) jogadasInvalidas++;
            else if ((v<1) || (v>9)) jogadasInvalidas++;
            else if (validaJogada(x, y, v, &tabuleiro) == 0) jogadasInvalidas++;
            else {
                tabuleiro[y][x] = v;
                jogadasValidas++;
            }
        }
    }
    
    //Imprime os resultados
    for (int k = jogadasInvalidas; k>0; k--) { printf("Jogada Invalida!\n"); }
    if (validaTabuleiro(&tabuleiro) == 1) printf("TABULEIRO RESOLVIDO!\n");
    else printf("TABULEIRO INCOMPLETO!\n");
    imprimeMatriz(&tabuleiro);
    printf("NUMERO DE JOGADAS: %d\n", jogadasValidas+jogadasInvalidas);
    printf("JOGADAS VALIDAS: %d\n", jogadasValidas);
    printf("JOGADAS INVALIDAS: %d\n", jogadasInvalidas);
}